﻿#include <iostream>

template <class Arg, class Result>
struct unary_function {
	typedef Arg argument_type;
	typedef Result result_type;
};

template <class Arg1, class Arg2, class Result>
struct binary_function {
	typedef Arg1 frist_argument_type;
	typedef Arg2 second_argument_type;
	typedef Result result_type;
};

template <class T>
struct identity : public unary_function<T, T> {
	const T&
		operator() (const T& x) const { return x; }
};

template <class T1, class T2>
struct Pair {
	typedef  T1 frist_type;
	typedef  T2 second_type;
	frist_type frist;
	second_type second;
	Pair() :frist(T1), second(T2) {}
	//这里初始化 frist 和 second 为什么使用的是T1()和T2()
	Pair(const T1&a, const T2&b)
		:frist(a), second(b) {}
	//...
};

template <class Pair>
struct select1st : public unary_function<Pair, typename Pair::frist_type> {
	const typename Pair::frist_type&
		operator() (const Pair& x) const
	{
		return x.frist;
	}
};

template <class Pair>
class select2st : public unary_function<Pair, typename Pair::second_type> {
public:
	const typename Pair::second_type&
		operator() (const Pair& x) const
	{
		return x.second;
	}
};

template <class T>
struct Plus : public binary_function<T, T, T> {
	T operator() (const T&x, const T&y) const { return x + y; }
};

template <class T>
struct minus : public binary_function<T, T, T> {
	T operator() (const T& x, const T& y) const { return x - y; }
};//使用方式 minus<Type> + () + (const Type& x, const Type& y) 分别代表的意思为 模板类型 + 函数名称 + 函数的参数

int main(void)
{
	std::cout << Plus<int>()(1, 3) << std::endl;
	std::cout << minus<int>() (1, 3) << std::endl;

	Plus<int>::result_type d = 5;
	return 0;
}


